# 求出新一层基站中每个基站的指引方向
import math


def bs_direction(BS_new_order, BS_new_edgepoints):
    BS_Dire = []
    temp_BS_Dire = []
    # 将每个基站周围的边缘点分段，并找出中心点
    # 循环边缘点列表
    for i in range(len(BS_new_edgepoints)):
        points = BS_new_edgepoints[i]  # 取出基站的边缘点
        p = points[1][:]  # 保留第一个点
        points = points[1:len(points)]  # 删除第一个点
        temp_edge = [p]  # 临时边缘点有序列表
        if len(points) < 20:  # 边缘点小于20个的没有指引方向
            continue
        while len(points) > 0:
            min_value = math.sqrt((p[0][0]-points[0][0])**2 + (p[0][1]-points[0][1])**2)
            # 判断两个相邻的边缘点是否属于同一段
            if min_value <= math.sqrt(2):
                temp_edge.append(points[1][:])  # 将其加入边缘点列表
            else:
                # 临时保存基站和基站边缘点信息
                temp_edge.append([BS_new_order[i,0], BS_new_order[i,1], BS_new_order[i,2], temp_edge])
            temp_edge = []  # 清空临时边缘点有序列表
            p = points[1][:]  # 保留新加入的边缘点
            points = points[1:len(points)]  # 删除该点

        # 基站与自己的一段边缘点
        temp_edge.append([BS_new_order[i, 0], BS_new_order[i, 1], BS_new_order[i, 2], temp_edge])

    # 寻找每一段的边缘中间点
    for i in range(len(temp_BS_Dire)):
        if len(temp_BS_Dire[i][3]) < 20:  # 边缘点小于20个的没有指引方向
            continue
        mid_index = search_mid(temp_BS_Dire[i][3], 1)
        BS_Dire.append([temp_BS_Dire[i][0], temp_BS_Dire[i][1], temp_BS_Dire[i][2], temp_BS_Dire[i][3][mid_index][0], temp_BS_Dire[i][3][mid_index][1]])


# 找出位于中间的边缘点
def search_mid(points, front):
    dis = []
    # 循环求出每个点到两端的距离差值
    for i in range(1, len(points)-1):
        dis_front = math.sqrt((points[0][0]-points[i][0])**2 + (points[0][1]-points[i][1])**2)
        dis_after = math.sqrt((points[-1][0]-points[i][0])**2 + (points[-1][1]-points[i][1])**2)
        dis.append(abs(dis_front - dis_after))

    min_value = min(dis)
    index = dis.index(min_value)
    index = index + front
    return index
